import {
  getCartList,
  postAddToCart,
  getCheckCartById,
  postBatchCheckCart,
  deleteCartBySkuId,
  deleteBatchDeleteCart,
} from '@/api/cart'

const state = {
  //购物车列表
  cartList: [],
}
const mutations = {
  UP_CART_LIST(state, payload) {
    state.cartList = payload
  },
  UP_CARTLIST_CHECKED_BY_ID(state, payload) {
    //根据id找到购物信息
    const info = state.cartList.find((v) => v.skuId == skuId)
    info.isChecked = info.isChecked ? 0 : 1
  },
}
const actions = {
  //调用购物车列表接口
  async getCartListAsync(context) {
    const res = await getCartList()
    context.commit('UP_CART_LIST', res.data[0]?res.data[0].cartInfoList:[])
  },
  //加入购物车
  async postAddToCartAsync(context, { skuId, skuNum }) {
    await postAddToCart(skuId, skuNum)
  },
  // 切换商品状态
  async getCheckCartByIdAsync({ commit, dispatch }, { skuId, isChecked }) {
    // 通过接口更改数据库中的数据状态
    await getCheckCartById(skuId, isChecked)
    // 1、缺点：需要通过程序更改一下前端的数据状态（state->cartList->isChecked）
    //如果多个人同时打开购物车，其中有一个人更改了状态，另外一个人有可以操作失误
    //    优点：减少ajax请求
    // commit("UP_CARTLIST_CHECKED_BY_ID",skuId)

    // 2- 优点：每次操作后可以获取到最新的数据。
    //    缺点：增加ajax请求
    dispatch('getCartListAsync')
  },
  // 批量更改选中的状态
  async postBatchCheckCartAsync(context) {
    // 0---->1
    console.log(context)
    // 如果全选为真，那么要修改为假，如果全选为假，那么要修改为真。
    const isChecked = context.getters.isAll ? 0 : 1
    // 获取要修改的ID数组
    const skuIdList = context.state.cartList
      .filter((v) => v.isChecked === context.getters.isAll)
      .map((item) => item.skuId)
    await postBatchCheckCart(isChecked, skuIdList)
    await context.dispatch('getCartListAsync')
  },
  //根据商品ID删除商品行信息
  async deleteCartBySkuIdAsync({ dispatch }, skuId) {
      await deleteCartBySkuId(skuId)
      await dispatch('getCartListAsync')
  },
  // 删除选中的购物车信息
  async deleteIsCheckedAsync({ dispatch }, skuIdList) {
    await deleteBatchDeleteCart(skuIdList)
    await dispatch('getCartListAsync')
  },
}
const getters = {
  // 是否被全选
  isAll(state) {
    // isChecked
    return state.cartList.every((item) => item.isChecked === 1) ? 1 : 0
  },
  //是否有被选中的数据
  isChecked(state) {
    return state.cartList.some((item) => item.isChecked)
  },
  // 计算选中的商品数量以及对应的商品价格之和
  getNumAndPrice(state){
    let num = 0;// 选中的商品数量
    let price=0;// 选中的商品价格之和
    state.cartList.forEach(function(item){
      if(item.isChecked){
        num++;
        price+= item.skuNum*item.skuPrice;
      }
    });
    return {
      num,
      price
    }
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters,
}
